package controllers.GestionTratamientoDatos.Metodos.Verificacion.Metodos;

import controllers.GestionTratamientoDatos.Metodos.Verificacion.MetodoVerificacionBase;
import models.Hidregistro;
import java.util.List;
import java.util.ArrayList;

/**
 * Created with IntelliJ IDEA.
 * User: Daniel
 * Date: 26/03/13
 * Time: 12:56 PM
 * To change this template use File | Settings | File Templates.
 */
public class VerificacionVariacionPrecedente extends MetodoVerificacionBase {

    public double umbral;

    public VerificacionVariacionPrecedente(List<Hidregistro> serieEntrada)
    {
        super(serieEntrada);
    }

    public VerificacionVariacionPrecedente(List<Hidregistro> serieEntrada, double umbral)
    {
        super(serieEntrada);
        this.umbral = umbral;
    }

    @Override
    public void Verificar()
    {
        DeterminarDatosVerificados();
    }

    @Override
    public void VerificarUltimoAnho()
    {
        DeterminarDatosVerificadosUltimoAnho();
    }

    public void DeterminarDatosVerificados()
    {
        double []arregloCompletado = CompletarArreglo(getSerieEntrada(),1);
        double []arregloDiferencias = ArregloDiferencias(arregloCompletado);

        List<Hidregistro> hidregistros = new ArrayList<Hidregistro>();

        for (int i = 0; i < arregloDiferencias.length; i++)
        {
             if(Math.abs(arregloDiferencias[i]) > getUmbral())
             {
                 hidregistros.add(getSerieEntrada().get(i));
             }
        }

        setSerieSalida(hidregistros);
    }

    public void DeterminarDatosVerificadosUltimoAnho()
    {
        double []arregloCompletado = CompletarArreglo(getSerieUltimoAnho(),1);

        arregloCompletado[0] = getSerieEntrada().get(getSerieEntrada().size() - 1).getRegestval();

        double []arregloDiferencias = ArregloDiferenciasUltimoAnho(arregloCompletado);

        List<Hidregistro> hidregistros = new ArrayList<Hidregistro>();

        for (int i = 0; i < arregloDiferencias.length; i++)
        {
            if(Math.abs(arregloDiferencias[i]) > getUmbral())
            {
                hidregistros.add(getSerieEntrada().get(i));
            }
        }

        setSerieSalida(hidregistros);
    }

    public double[] ArregloDiferencias(double []arregloEntrada)
    {
        double []arregloDiferencias = new double[getSerieEntrada().size()];

        for (int i = 1;i < arregloDiferencias.length + 1; i++)
        {
            arregloDiferencias[i - 1] = arregloEntrada[i] - arregloEntrada[i - 1];
        }

        return arregloDiferencias;
    }

    public double[] ArregloDiferenciasUltimoAnho(double []arregloEntrada)
    {
        double []arregloDiferencias = new double[getSerieUltimoAnho().size()];

        for (int i = 1;i < arregloDiferencias.length + 1; i++)
        {
            arregloDiferencias[i - 1] = arregloEntrada[i] - arregloEntrada[i - 1];
        }

        return arregloDiferencias;
    }

    public double getUmbral() {
        return umbral;
    }

    public void setUmbral(double umbral) {
        this.umbral = umbral;
    }
}
